#ifndef __SharedMemory__H__
#define __SharedMemory__H__

#include <QObject>

QT_BEGIN_NAMESPACE
class QSystemSemaphore;
class QSharedMemory;
QT_END_NAMESPACE
class SharedMemory : public QObject
{
    Q_OBJECT
public:
    explicit SharedMemory(QString semaphore, QObject *parent=nullptr);

    /**
     * @brief  验证是否已经通过实例检查，并自动创建单个实例对象
     * @note   
     * @retval 
     */
    bool isValid();

private:
    bool m_valid;

    QSystemSemaphore *systemSemaphore;
    QSharedMemory *sharedMemory;
};

#endif  //!__SharedMemory__H__


// 信号量是互斥锁的泛化。一个互斥对象只能被锁定一次，而一个信号量可以被获取多次。
    // 通常，一个信号量用于保护一定数量的相同资源。
// 与轻量级的QSemaphore一样，QSystemSemaphore可以从多个线程访问。
    // 与QSemaphore不同，QSystemSemaphore还可以从多个进程访问。
    // 这意味着QSystemSemaphore是一个更重的类，
    // 因此如果您的应用程序不需要跨多个进程访问您的信号量，您可能希望使用QSemaphore。
// 信号量支持两个基本操作，acquire()和release():
// Acquire()尝试获取一个资源。如果没有可用的资源，则调用将阻塞，直到有资源可用为止。
    // 然后获取资源并返回调用。
// Release()释放一个资源，这样它就可以被另一个进程获取。
    // 也可以使用参数n > 1调用该函数，该参数将释放n个资源。
// 系统信号量是用一个字符串键创建的，其他进程可以使用该字符串键来使用相同的信号量。

